package leetcode.Hot100;

import java.util.HashMap;

/**
 * @author Cheng Jun Description: 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target
 *     的那两个整数，并返回它们的数组下标。
 *     <p>你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
 *     <p>你可以按任意顺序返回答案。
 *     <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/two-sum
 *     著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @version 1.0
 * @date 2021/11/5 13:39
 */
public class twoSum {

  public static void main(String[] args) {}

  // 解题思路：遍历nums数组，将 nums[i] 作为 key，i 作为 value 存入 HashMap 中，
  static int[] twoSum(int[] nums, int target) {
    if (nums.length < 2) {
      return null;
    }
    HashMap<Integer, Integer> numIndexMap = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
      // 计算 target与nums[i] 的差值，并检查该差值之前是否在数组中出现过
      int diff = target - nums[i];
      Integer index = numIndexMap.get(diff);
      // if else 的写法，最好是理论上越先出现的情况越靠前，比如这里，第一次进入循环体，numIndexMap.get(diff)肯定返回null
      if (index == null) {
        numIndexMap.put(nums[i], i);
      } else {
        return new int[] {index, i};
      }
    }
    return null;
  }

  // 解题思路：遍历nums数组，将 target-nums[i] 作为 key，i 作为 value 存入 HashMap 中，
  static int[] twoSum1(int[] nums, int target) {
    HashMap<Integer, Integer> diffIndexMap = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
      Integer index = diffIndexMap.get(nums[i]);
      if (index == null) {
        diffIndexMap.put(target - nums[i], i);
      } else {
        return new int[] {index, i};
      }
    }
    return null;
  }
}
